import json

from django.http import Http404
from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ViewSet, GenericViewSet,ModelViewSet

from booktest.models import BookInfo
from rest_framework import mixins
# Create your views here.
from booktest.serializers import BookInfoSerializer

# 1、自定义Restful API接口，提供以下五个接口：
# 1）获取所有的图书的信息； GET /books/
# 2）新增一本图书的信息； POST /books/
# 3）获取指定的图书的信息（根据ID）；  GET /books/ID/
# 4）修改指定的图书的信息（根据ID）；   PUT books/ID/
# 5）删除指定的图书的信息（根据ID）。   DELETE /books/ID

# 需求：
# 1.获取id最新的一本图书的信息  GET /books/latest/
# 2.修改指定图书的阅读量（只更新阅读量）PUT /books/(?P<pk>\d+)/read/
# /books/
# class BookInfoViewSet(mixins.ListModelMixin,
#                       mixins.CreateModelMixin,
#                       mixins.RetrieveModelMixin,
#                       mixins.UpdateModelMixin,
#                       mixins.DestroyModelMixin,
#                       GenericViewSet):
class BookInfoViewSet(ModelViewSet):
    # 指定当前视图所使用的序列化器类
    serializer_class = BookInfoSerializer
    queryset = BookInfo.objects.all()

    # 指定router生成视图集处理函数url配置项时，提取的参数正则表达式
    lookup_value_regex = '\d+'
    # def get_serializer_class(self):
    #     if self.action == 'list':
    #         # 返回list操作所使用的序列化器类
    #     elif self.action == 'latest':
    #         # 返回latest操作所使用的序列化器类
    #     else:
    #         # 返回其他操作所使用的序列化器类
    # def get_queryset(self):
    #     if self.action == 'list':
    #         # 返回list操作使用的查询集
    #     else:
    #         # 返回其他操作所使用的查询集
    # 1.获取id最新的一本图书的信息  GET /books/latest/
    @action(methods=['get'],detail=False,url_path='latest')
    def latest(self,request):
        """
        self.action: 字符串，获取所有执行的操作
        1.获取id最新的图书对象
        2.将图书对象序列化并返回
        :param request:
        :return:
        """
        # 1.获取id最新的图书对象
        book = BookInfo.objects.latest('id')

        # 2.将图书对象序列化并返回
        serializer = self.get_serializer(book)
        return Response(serializer.data)

    # 2.修改指定图书的阅读量（只更新阅读量）PUT /books/(?P<pk>\d+)/read/
    @action(methods=['put'],detail=True)
    def read(self,request,pk):
        """
        1.获取指定的图书对象，根据pk
        2.获取bread并进行校验
        3.更新图书阅读量
        4.返回更新图书序列化之后的数据
        :param request:
        :return:
        """
        # 需求：需要客户段传递参数bread，通过json数据
        # 1.获取指定的图书对象，根据pk
        book = self.get_object()
        # 2.获取bread并进行校验
        bread = request.data.get('bread')
        # 3.更新图书阅读量
        book.bread = bread
        book.save()
        # 4.返回更新图书序列化之后的数据
        serializer = self.get_serializer(book)
        return Response(serializer.data)
